package com.yxqz.xfz.rabbitmq;

import com.rabbitmq.client.*;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

/**
 * @author 鱼香茄子
 * @data 2021/10/26
 * 邮件路由消费之
 */
public class Consumer03_routing_sms {

    private static final String QUEUE_INFORM_SMS = "queue_inform_sms";
    private static final String EXCHANGE_ROUTING_INFORM="exchange_routing_inform";
    private static final String ROUTING_KEY_SMS="key_sms";


    public static void main(String[] args) throws IOException, TimeoutException {
        Connection connection = null;
        Channel channel = null;
        try {
            ConnectionFactory factory = new ConnectionFactory();
            factory.setHost("127.0.0.1");
            factory.setPort(5672);
            factory.setUsername("guest");
            factory.setPassword("guest");
            factory.setVirtualHost("/");//rabbitmq默认虚拟机名称为“/”，虚拟机相当于一个独立的mq服务器
//创建与RabbitMQ服务的TCP连接
            connection = factory.newConnection();
//创建与Exchange的通道，每个连接可以创建多个通道，每个通道代表一个会话任务
            channel = connection.createChannel();


            /**
             * 声明队列，如果Rabbit中没有此队列将自动创建
             * param1:队列名称
             * param2:是否持久化
             * param3:队列是否独占此连接
             * param4:队列不再使用时是否自动删除此队列
             * param5:队列参数
             */
            channel.queueDeclare(QUEUE_INFORM_SMS, true, false, false, null);




            /* 声明一个交换机
            参数明细
                    * 1、交换机名称
                    * 2、交换机类型，fanout、topic、direct、headers*/
            channel.exchangeDeclare(EXCHANGE_ROUTING_INFORM, BuiltinExchangeType.DIRECT);


            /* 交换机和队列进行绑定
             * 参数明细：
             * 1、队列名称
             * 2、交换机名称
             * 3、路由key 交换机通过key值把消息发送到指定的 队列中。
             */
            channel.queueBind(QUEUE_INFORM_SMS, EXCHANGE_ROUTING_INFORM, ROUTING_KEY_SMS);



//            实现消费方法
            DefaultConsumer defaultConsumer = new DefaultConsumer(channel) {
                /**
                 *   接收到消息后，该方法被调用
                 * @param consumerTag 消费者标签，用来标识消费者，可以在监听队列的时候设置
                 * @param envelope 信封
                 * @param properties 消息内容
                 * @param body 消息内容
                 * @throws IOException io异常
                 */
                @Override
                public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                    String exchange = envelope.getExchange();//交换机
                    envelope.getDeliveryTag();//消息id ，mq的标识消息的id 用来确认消息已经收到了
//                    消息内容
                    String message = new String(body, "utf-8");
                    System.out.println("接收到消息(message)：" + message);

                }
            };


            channel.basicConsume(QUEUE_INFORM_SMS,true,defaultConsumer);

        } catch (Exception ex) {
            ex.printStackTrace();
        }
//        消费者不要关闭连接
    }


}
